home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / intrfc55.arc / BLOCKS.PAS next >
Pascal/Delphi Source File  |  1990-02-25  |  5KB  |  224 lines

  1. unit blocks;
  2.  
  3. interface
  4.  
  5. type
  6.   entry_pt_ptr = ^entry_pt_rec;
  7.   entry_pt_rec = record
  8.     code_block, offset : word;
  9.   end;
  10.  
  11.   block_ptr = ^block_rec;
  12.   block_rec = record
  13.     w1,size : word;
  14.     relocbytes,owner : word;
  15.   end;
  16.  
  17.   const_block_ptr = ^const_block_rec;
  18.   const_block_rec = record
  19.     w1,size : word;
  20.     relocbytes,obj_ofs : word;
  21.   end;
  22.  
  23.   vmt_block_ptr = ^vmt_block_rec;
  24.   vmt_block_rec = record
  25.     unitnum,rtype : byte;
  26.     entrynum,w3,vmt_ofs : word;
  27.   end;
  28.  
  29.   unit_block_ptr = ^unit_block_rec;
  30.   unit_block_rec = record
  31.     w1 : word;
  32.     name : string;
  33.   end;
  34.  
  35.   debug_block_ptr = ^debug_block_rec;
  36.   debug_block_rec = record
  37.     obj_ofs, w2, w3, startline, len : word;
  38.     bytes_per_line : array[1..1] of byte;
  39.   end;
  40.  
  41. procedure print_entries;
  42. procedure print_code_blocks;
  43. procedure print_const_blocks;
  44. procedure print_var_blocks;
  45. procedure print_unit_blocks;
  46.  
  47. function unit_name(ofs:word):string;
  48. procedure write_code_block_name(debug_ofs : word);
  49. procedure write_const_block_name(info_ofs : word);
  50.  
  51. procedure add_referenced_units;
  52.  
  53. implementation
  54.  
  55. uses dump,util,globals,head,loader,namelist,nametype,reloc;
  56.  
  57. procedure print_entries;
  58. var
  59.   block:entry_pt_ptr;
  60.   ofs,limit : word;
  61. begin
  62.   ofs := 0;
  63.   limit := header^.ofs_code_blocks-header^.ofs_entry_pts;
  64.   if ofs<limit then
  65.   begin
  66.     writeln('Entry records');
  67.     writeln('    Proc     Code block:offset');
  68.   end;
  69.   while ofs<limit do
  70.   begin
  71.     block := add_offset(buffer,header^.ofs_entry_pts+ofs);
  72.     writeln(hexword2(ofs):8,
  73.             hexword2(block^.code_block):12,':',hexword(block^.offset));
  74.     inc(ofs,sizeof(block^));
  75.   end;
  76. end;
  77.  
  78. procedure write_code_block_name(debug_ofs : word);
  79. var
  80.   debug : debug_block_ptr;
  81.   obj : obj_ptr;
  82.   info : func_info_ptr;
  83.   parent_info : word;
  84.   parent_obj : obj_ptr;
  85. begin
  86.   if debug_ofs = $FFFF then
  87.     exit;
  88.   debug := add_offset(buffer,header^.ofs_line_lengths+debug_ofs);
  89.   if debug^.obj_ofs = 0 then
  90.     write('Startup code')
  91.   else
  92.   begin
  93.     obj := add_offset(buffer,debug^.obj_ofs);
  94.     if obj^.obj_type = proc_id then
  95.     begin
  96.       info := add_offset(obj,4+length(obj^.name));
  97.       parent_info := info^.parent_ofs;
  98.       if parent_info <> 0 then
  99.       begin
  100.         parent_obj := find_type(unit_list[1],parent_info);
  101.         if parent_obj <> nil then
  102.           write(parent_obj^.name,'.')
  103.         else
  104.           write('obj',hexword(parent_info),'.');
  105.       end;
  106.     end;
  107.     write(obj^.name);
  108.   end;
  109. end;
  110.  
  111. procedure write_const_block_name(info_ofs : word);
  112. var
  113.   obj : obj_ptr;
  114. begin
  115.   if info_ofs = 0 then
  116.     exit;
  117.   obj := find_type(unit_list[1],info_ofs);
  118.   if obj <> nil then
  119.     write(obj^.name)
  120.   else
  121.     write('obj',hexword(info_ofs));
  122. end;
  123.  
  124. procedure print_blocks(blocktype:string; base,limit:word);
  125. var
  126.   ofs : word;
  127.   block : block_ptr;
  128. begin
  129.   writeln;
  130.   ofs := 0;
  131.   if ofs < limit then
  132.   begin
  133.     writeln(blocktype,' blocks');
  134.     writeln('Blocknum   Bytes  Relocrecs   Owner');
  135.   end;
  136.   while ofs < limit do
  137.   begin
  138.     block := add_offset(buffer,base+ofs);
  139.     with block^ do
  140.     begin
  141.       write(hexword2(ofs):8,hexword2(size):8,hexword2(relocbytes):8,
  142.                 hexword2(owner):8,' ');
  143.       if blocktype = 'Code' then
  144.         write_code_block_name(owner)
  145.       else if blocktype = 'Const' then
  146.         write_const_block_name(owner);
  147.       writeln;
  148.       if w1 <> 0 then
  149.         writeln(' w1 = ',hexword(w1));
  150.     end;
  151.     inc(ofs,sizeof(block_rec));
  152.   end;
  153. end;
  154.  
  155. procedure print_code_blocks;
  156. var
  157.   base,limit:word;
  158. begin
  159.   base := header^.ofs_code_blocks;
  160.   limit := header^.ofs_const_blocks - base;
  161.   print_blocks('Code',base,limit);
  162. end;
  163.  
  164. procedure print_const_blocks;
  165. var
  166.   base,limit:word;
  167. begin
  168.   base := header^.ofs_const_blocks;
  169.   limit := header^.ofs_var_blocks - base;
  170.   print_blocks('Const',base,limit);
  171. end;
  172.  
  173. procedure print_var_blocks;
  174. var
  175.   base,limit:word;
  176. begin
  177.   base := header^.ofs_var_blocks;
  178.   limit := header^.ofs_unit_list - base;
  179.   print_blocks('Var',base,limit);
  180. end;
  181.  
  182. procedure print_unit_blocks;
  183. var
  184.   base,ofs,limit:word;
  185.   block : unit_block_ptr;
  186. begin
  187.   base := header^.ofs_unit_list;
  188.   ofs := 0;
  189.   limit := header^.ofs_src_name - ofs;
  190.   writeln('Unit list');
  191.   writeln(' Offset    w1     Name');
  192.   while base+ofs < limit do
  193.   begin
  194.     block := add_offset(buffer,base+ofs);
  195.     with block^ do
  196.     begin
  197.       writeln(hexword2(ofs):8,hexword2(w1):8,'  ',name);
  198.       ofs := ofs + 3 + length(name);
  199.     end;
  200.   end;
  201. end;
  202.  
  203. function unit_name(ofs:word):string;
  204. begin
  205.   unit_name := unit_block_ptr(
  206.                 add_offset(buffer,header^.ofs_unit_list+ofs))^.name;
  207. end;
  208.  
  209. procedure add_referenced_units;
  210. var
  211.   block : unit_block_ptr;
  212.   ofs   : word;
  213. begin
  214.   ofs := header^.ofs_unit_list;
  215.   while ofs < header^.ofs_src_name do
  216.   begin
  217.     block := add_offset(buffer,ofs);
  218.     add_unit(block^.name);
  219.     ofs := ofs + 3 + length(block^.name);
  220.   end;
  221. end;
  222.  
  223. end.
  224.